home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / FALCON / ACC / DRIVERS.ACC / SLIDERS.C < prev    next >
Encoding:
C/C++ Source or Header  |  2001-02-10  |  8.7 KB  |  318 lines

  1. /* FILE:     SLIDERS.C
  2.  *==========================================================================
  3.  * DATE:        February 5, 1990
  4.  * MODIFIED: November 16, 1990 - for FSMACC.ACC
  5.  *        November 5, 1992 3D
  6.  *
  7.  * DESCRIPTION:  MODIFIED TO REMOVE HORIZONTAL CODE                           
  8.  *
  9.  * INCLUDE FILE: SLIDERS.H
  10.  */
  11.  
  12. /* INCLUDE FILES
  13.  *==========================================================================
  14.  */ 
  15. #include <sys\gemskel.h>
  16. #include <stdlib.h>
  17.  
  18. #include "country.h"
  19. #include "mainstuf.h"
  20.  
  21.  
  22.  
  23.  
  24. /* PROTOTYPES
  25.  *==========================================================================
  26.  */
  27. void sl_size( OBJECT *tree, int base, int slider, int num_items,
  28.               int visible, int direction, int min_size );
  29.            
  30. void sl_y( OBJECT *tree, int base, int slider, int value,
  31.            int num_min, int num_max, void (*foo)() );
  32.  
  33. void sl_arrow( OBJECT *tree, int base, int slider, int obj,
  34.                int inc, int min, int max, int *numvar, int direction,
  35.                void (*foo)() );
  36.                
  37. void sl_dragy( OBJECT *tree, int base, int slider, int min,
  38.                int max, int *numvar, void (*foo)() );
  39.                
  40. int  Calc_Value( int slidxy, int basexy, int basewh,
  41.                  int obwh, int min, int max );
  42.  
  43.  
  44. /* DEFINES
  45.  *==========================================================================
  46.  */
  47. /* Slider Time Delay Definitions */
  48. #define SL_MAX_DELAY     0
  49. #define SL_MIN_DELAY     0
  50. #define SL_INC         0
  51.  
  52. /* Orientation of sliders */
  53. #define VERTICAL    0
  54. #define HORIZONTAL    1
  55.  
  56. #define NULLFUNC    ( void(*)())0L
  57.  
  58.  
  59.  
  60. /* GLOBALS
  61.  *==========================================================================
  62.  */
  63.  
  64.  
  65.  
  66.  
  67. /* sl_size()
  68.  *==========================================================================
  69.  * Size the slider
  70.  *
  71.  * IN:       OBJECT *tree:    Object tree
  72.  *       int    base:        base of slider
  73.  *       int    slider:    slider object - it must be child of base
  74.  *       int    num_items:    Total number of items accounted for
  75.  *       int    visible:    Number of said items visible at one time
  76.  *       int    direction:    Horizontal or Vertical - See defines above
  77.  *       int      min_size:    Minimum Pixel Size
  78.  *
  79.  * OUT:    void
  80.  */ 
  81. void
  82. sl_size( OBJECT *tree, int base, int slider, int num_items,
  83.          int visible, int direction, int min_size )
  84. {
  85.      int size = 1000;
  86.  
  87.      if( visible && num_items )
  88.        size = min( 1000, (int)((1000L * (long)visible) / (long)num_items) );
  89.  
  90.       if( direction == VERTICAL )
  91.       {
  92.          ObH( slider ) = (int)(( (long)size * (long)ObH( base )) / 1000L );
  93.          ObH( slider ) = max( min_size, ObH( slider ) );
  94.       }   
  95. }
  96.  
  97.  
  98.  
  99.  
  100. /* sl_y()
  101.  *==========================================================================
  102.  * Modify slider in y position
  103.  *
  104.  * IN:   OBJECT *tree:        object tree
  105.  *     int    base:        base of slider
  106.  *     int    slider:            slider object - must be child of base
  107.  *     int    txtobj:        txtobj for numbers. This does NOT have to
  108.  *                be a child of the base. -1 if there is none.
  109.  *     int    value:        current value
  110.  *     int    num_min:    minimum item number
  111.  *     int    num_max:    maximum item number
  112.  *     void  (*foo)():    Drawing routine passed in by calling routine
  113.  *
  114.  * OUT:  void
  115.  */
  116. void
  117. sl_y( OBJECT *tree, int base, int slider, int value,
  118.       int num_min, int num_max, void (*foo)( void ) )      
  119. {
  120.     if( value == num_min ) {
  121.     ObY(slider) = ObH(base) - ObH(slider);
  122.     } else {
  123.     ObY(slider) = 
  124.         (int)( ( (long)(value-num_max) *
  125.                ( (long)(ObH(base) - ObH(slider)) * 1000L )
  126.                ) /
  127.                ( (long)(num_min - num_max) * 1000L )
  128.                );
  129.     }   
  130.     
  131.     if( foo != NULLFUNC )
  132.         (*foo)();          
  133. }
  134.  
  135.  
  136.  
  137. /* sl_arrow()
  138.  *==========================================================================
  139.  * Handle both horizontal and vertical arrow buttons
  140.  *
  141.  * IN:   OBJECT *tree:        object tree
  142.  *     int base:        base of slider object
  143.  *     int slider:        slider object - this must be child of base
  144.  *     int obj:        Arrow object clicked on
  145.  *     int txtobj:        txt object for numbers. -1 if there is none.
  146.  *                Does not have to be a child of base.
  147.  *     int inc:        increment by this amount
  148.  *     int min:        min item number
  149.  *     int max:        max item number
  150.  *     int *numvar:        current value
  151.  *     int direction:        Horizontal or vertical
  152.  *     void (*foo)():        Drawing routine passed in.
  153.  *
  154.  * OUT:  void
  155.  */
  156. void
  157. sl_arrow( OBJECT *tree, int base, int slider, int obj,
  158.           int inc, int min, int max, int *numvar,
  159.           int direction, void (*foo)() )
  160. {
  161.     MRETS mk;
  162.     int   newvalue, oldvalue;
  163.     GRECT slidrect;
  164.     MRETS m;
  165.  
  166.     slidrect = ObRect( slider );
  167.     objc_offset( tree, slider, &slidrect.g_x, &slidrect.g_y );
  168.     /* account for outlines */
  169.     slidrect.g_x -= 3;
  170.     slidrect.g_y -= 3;
  171.     slidrect.g_w += 6;
  172.     slidrect.g_h += 6;
  173.  
  174.     if( obj > 0 )
  175.     XSelect( tree, obj );
  176.  
  177.     oldvalue = *numvar;
  178.     do {
  179.     newvalue = *numvar + inc;
  180.  
  181.     if( max > min )
  182.     {
  183.         if( newvalue < min ) newvalue = min;
  184.         else if( newvalue > max ) newvalue = max;
  185.     }
  186.     else
  187.     {
  188.         if( newvalue > min ) newvalue = min;
  189.         else if( newvalue < max ) newvalue = max;
  190.     }
  191.  
  192.     /* if in bounds, change the slider thumb */
  193.     if( newvalue != oldvalue ) {
  194.         oldvalue = newvalue;
  195.         *numvar = newvalue;
  196.  
  197.         if( direction == VERTICAL )          
  198.             sl_y( tree, base, slider, newvalue, min, max, foo );
  199.             
  200.         /* undraw old */
  201.         Objc_draw( tree, base, 3 , &slidrect ); /* was 0 */
  202.         /* draw new */
  203.         objc_offset( tree, slider, &slidrect.g_x, &slidrect.g_y );
  204.             slidrect.g_x -= 3;
  205.             slidrect.g_y -= 3;
  206.             slidrect.g_w += 6;
  207.         slidrect.g_h += 6;
  208.         Objc_draw( tree, base, 3 , &slidrect );
  209.         }
  210.     Graf_mkstate( &mk );
  211.     } while( mk.buttons != 0 );
  212.  
  213.     if( obj > 0 )
  214.     XDeselect( tree, obj );
  215.     Objc_draw( tree, base, MAX_DEPTH, &slidrect );
  216.     Evnt_button( 1, 1, 0, &m );
  217. }
  218.  
  219.  
  220.  
  221. /* sl_dragy()
  222.  *==========================================================================
  223.  * Handle dragging the slider vertically
  224.  */
  225. void
  226. sl_dragy( OBJECT *tree, int base, int slider, int min,
  227.           int max, int *numvar, void (*foo)() )
  228. {
  229.     int newvalue, yoffset, slidy, lastvalue;
  230.     MRETS mk;
  231.     GRECT baserect, slidrect;
  232.  
  233.    /* get slider extent */
  234.     baserect = ObRect( base );
  235.     objc_offset( tree, base, &baserect.g_x, &baserect.g_y );
  236.  
  237.     /* get slide box extent */
  238.     slidrect = ObRect( slider );
  239.     objc_offset( tree, slider, &slidrect.g_x, &slidrect.g_y );
  240.     /* find mouse offset into slide box */
  241.     Graf_mkstate( &mk );
  242.     yoffset = mk.y - (slidrect.g_y + (slidrect.g_h / 2));
  243.     /* adjust box w/h for clip */
  244.     slidrect.g_x -= 3;
  245.     slidrect.g_y -= 3;
  246.     slidrect.g_w += 6;
  247.     slidrect.g_h += 6;
  248.  
  249.     lastvalue = min-1;
  250.     while( mk.buttons )
  251.     {
  252.        /* get current slide box Y coordinate */
  253.        slidy = mk.y - yoffset;
  254.        /* translate it to a value */
  255.        if( slidy < baserect.g_y + ObH(slider)/2 )
  256.           newvalue = max;
  257.        else if( slidy > baserect.g_y + baserect.g_h - ObH(slider)/2 )
  258.           newvalue = min;
  259.        else{
  260.         newvalue = Calc_Value( slidy, baserect.g_y,
  261.                        baserect.g_h, ObH( slider ),
  262.                        max, min );         
  263.        }
  264.        if( newvalue != lastvalue )
  265.        {
  266.           lastvalue = newvalue;
  267.           /* update the value, and draw the slidebox */
  268.           *numvar = newvalue;
  269.           sl_y( tree, base, slider, newvalue, min, max, foo );
  270.           /* undraw old */
  271.           Objc_draw( tree, base, 2, &slidrect );
  272.           objc_offset( tree, slider, &slidrect.g_x, &slidrect.g_y );
  273.           
  274.           slidrect.g_x -= 3;
  275.           slidrect.g_y -= 3;
  276.       slidrect.g_w += 6;
  277.       slidrect.g_h += 6;
  278.  
  279.           /* draw new */
  280.       Objc_draw( tree, base , MAX_DEPTH, &slidrect );
  281.     }
  282.     Graf_mkstate( &mk );
  283.     }
  284. }
  285.  
  286.  
  287.  
  288.  
  289. /* Calc_Value()
  290.  *==========================================================================
  291.  *Calculate a new value for sl_dragx() and sl_dragy()
  292.  *  IN: int    slidxy:      sldx or sldy
  293.  *      int    basexy:        baserect.g_x or baserect.g_y
  294.  *    int    basewh:        baserect.g_w or baserect.g_h
  295.  *    int    obwh:        ObH() or (ObW)
  296.  */
  297. int
  298. Calc_Value( int slidxy, int basexy, int basewh,
  299.             int obwh, int min, int max )
  300. {
  301.    long top = 0L;
  302.    int  digit = 0;
  303.    long bottom = 0L;
  304.    
  305.    top      = (long)((long)(max - min) * 1000L *
  306.                      (long)(slidxy - basexy - ( obwh / 2 ) ) );
  307.                     
  308.    bottom   = (long)(basewh - obwh ) * 1000L;
  309.    if( top && bottom )
  310.    {
  311.      digit    = (int)((long)(top % bottom) > (long)(bottom / 2L));
  312.      top     /= bottom;
  313.    }  
  314.    return( min + (int)top + digit );
  315. }
  316.  
  317.  
  318.